package main

import (
	"fmt"
	//"math"
)

//声明全局变量
var a int = 10

//函数返回单值
func max(num1, num2 int) int {
	var result int
	if num1 > num2 {
		result = num1
	} else {
		result = num2
	}
	return result
}

//函数可以返回多个值
func swap(x, y string) (string, string) {
	x, y = y, x //go语言可直接交换两个值
	return x, y //或调换return顺序也可达到交换目的
}

//通过引用交换
func swap2(x *int, y *int) {
	var temp int
	temp = *x
	*x = *y
	*y = temp
}

//函数闭包封装
func getSequence() func() int {
	i := 0
	return func() int {
		i += 1
		return i
	}
}

//结构体
type Circle struct {
	radius float64
}

//此函数为Circle类型结构体内的函数，返回一个float64
func (c Circle) getArea() float64 {
	return 3.14 * c.radius * c.radius
}

func main() {

	//调用函数并返回最大值
	//同名局部变量会覆盖全局变量
	// var a int = 100
	// var b int = 200
	// var max1 int
	// max1 = max(a, b)
	// fmt.Printf("最大值是：%d\n", max1)

	a, b := swap("string1", "string2")
	fmt.Println(a, b)

	// var a int = 10
	// var b int = 20
	// fmt.Printf("交换前a的值：%d\n", a)
	// fmt.Printf("交换前b的值：%d\n", b)
	// swap2(&a, &b)
	// fmt.Printf("交换后a的值：%d\n", a)
	// fmt.Printf("交换后b的值：%d\n", b)

	//直接定义函数
	// getSquareRoot := func(x float64) float64 {
	// 	return math.Sqrt(x)
	// }
	// fmt.Println(getSquareRoot(9))

	//闭包使用
	//定义nextNumber为一个getSequence函数，函数i为0
	//每调用一次nextNumber函数，内部i变量自增1并返回
	// nextNumber := getSequence()
	// fmt.Println(nextNumber())
	// fmt.Println(nextNumber())
	// fmt.Println(nextNumber())
	// 重新建立一个新的nextNumber1函数，会重新计数
	// nextNumber1 := getSequence()
	// fmt.Println(nextNumber1())
	// fmt.Println(nextNumber1())
	// fmt.Println(nextNumber1())

	//试用结构体内函数
	// var c1 Circle
	// c1.radius = 10.00
	// fmt.Println("圆的面积 = ", c1.getArea())
	fmt.Println()
}
